import "@plasmohq/messaging/background"

import { startHub } from "@plasmohq/messaging/pub-sub"
import { Storage } from "@plasmohq/storage"

// 通过调用 startHub() 来启动 PubSub Hub
// 实现消息的订阅和发布
// ports 端口信息处理 长链接
// messages 消息处理 一次性
startHub()

console.log("background start")

/**
 * chrome所有窗口关闭后，清空登陆信息
 */
const storage = new Storage()

chrome.windows.onRemoved.addListener((windowId) => {
  console.log("windowId", windowId)
  // 检查是否关闭所有窗口
  chrome.windows.getAll(async (windows) => {
    if (windows.length === 0) {
      // 关闭所有窗口后, 清除登录信息
      await storage.set("loginInfo", {})
      await storage.set("isLogin", false)
      await storage.set("loginErr", "")
    }
  })
})

/**
 * 发送消息到活动标签页
 * @param action 消息类型，用于区分不同的消息处理逻辑
 * @param data 消息数据，包含需要传递的具体信息
 */
async function sendMessageToActiveTab(action: string, data: any) {
  // 获取当前活动标签页
  try {
    const [activeTab] = await chrome.tabs.query({
      active: true,
      currentWindow: true
    })

    if (activeTab?.id) {
      chrome.tabs.sendMessage(activeTab.id, {
        action,
        data
      })
    }
  } catch (error) {
    // 处理无法建立连接的错误
    console.error("Failed to send message:", error)
  }
}

/**
 * 网络请求监控，只能获取请求，不能获取请求结果
 */
chrome.webRequest.onCompleted.addListener(
  (requestDetails) => {
    const _url = requestDetails.url
    // 分解URL，提取基础URL和查询参数
    // URL的结构一般为：协议://域名/路径?查询参数
    const url = new URL(_url)
    const base_url = url.origin + url.pathname
    const search_params = new URLSearchParams(url.search)
    const query_obj = Object.fromEntries(search_params.entries())

    // 发送消息
    sendMessageToActiveTab("webRequest", {
      url: base_url,
      params: query_obj
    }).then()

    // 不拦截请求，允许其继续
    return null
  },
  // 配置需要监听的目标URL
  {
    urls: ["https://compass.jinritemai.com/compass_api*"],
    types: ["main_frame", "sub_frame", "xmlhttprequest", "script", "stylesheet"]
  }
)
